package com.cqrt.util;

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.List;

/**
 * 日期处理工具类：处理计划日期跳过周末的逻辑
 */
public class DateUtils {
    
    // 周末休息日
    private static final List<DayOfWeek> WEEKENDS = Arrays.asList(DayOfWeek.SATURDAY, DayOfWeek.SUNDAY);
    
    // 默认日期格式
    private static final DateTimeFormatter DEFAULT_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    /**
     * 处理计划日期，跳过周末
     * @param startDateStr 计划开始日期字符串
     * @param endDateStr 计划结束日期字符串
     * @return 包含处理后开始和结束日期的数组 [startDate, endDate]
     */
    public static LocalDateTime[] processPlanDates(String startDateStr, String endDateStr) {
        // 解析日期字符串
        LocalDateTime startDate = parseDateTime(startDateStr);
        LocalDateTime endDate = parseDateTime(endDateStr);
        
        // 处理开始日期（周六/周日 -> 下周一 00:00:00）
        if (isWeekend(startDate)) {
            startDate = moveToNextMonday(startDate, true);
        }
        
        // 处理结束日期（周六/周日 -> 下周一 23:59:59）
        if (isWeekend(endDate)) {
            endDate = moveToNextMonday(endDate, false);
        }
        
        return new LocalDateTime[]{startDate, endDate};
    }
    
    /**
     * 判断日期是否为周末
     */
    private static boolean isWeekend(LocalDateTime dateTime) {
        if (dateTime == null) {
            return false;
        }
        return WEEKENDS.contains(dateTime.getDayOfWeek());
    }
    
    /**
     * 将日期移动到下周一，并设置时间为00:00:00（开始日期）或23:59:59（结束日期）
     * @param dateTime 原日期
     * @param isStart 是否为开始日期（true=设置为00:00:00，false=设置为23:59:59）
     */
    private static LocalDateTime moveToNextMonday(LocalDateTime dateTime, boolean isStart) {
        // 计算需要添加的天数（周六+2天，周日+1天）
        int daysToAdd = dateTime.getDayOfWeek() == DayOfWeek.SATURDAY ? 2 : 1;
        
        // 移动到下周一
        LocalDate nextMonday = dateTime.toLocalDate().plusDays(daysToAdd);
        
        // 设置时间（开始日期为00:00:00，结束日期为23:59:59）
        LocalTime time = isStart ? LocalTime.MIN : LocalTime.MAX;
        
        return LocalDateTime.of(nextMonday, time);
    }
    
    /**
     * 解析日期字符串（支持多种格式）
     */
    private static LocalDateTime parseDateTime(String dateStr) {
        if (dateStr == null || dateStr.trim().isEmpty()) {
            return null;
        }
        
        // 尝试常见格式
        List<DateTimeFormatter> formatters = Arrays.asList(
            DEFAULT_FORMATTER,
            DateTimeFormatter.ofPattern("yyyy-MM-dd"),
            DateTimeFormatter.ofPattern("yyyy/MM/dd"),
            DateTimeFormatter.ofPattern("yyyyMMdd"),
            DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"),
            DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm")
        );
        
        for (DateTimeFormatter formatter : formatters) {
            try {
                if (dateStr.contains(" ")) {
                    // 包含时间部分
                    return LocalDateTime.parse(dateStr, formatter);
                } else {
                    // 只有日期部分，默认时间为00:00:00
                    return LocalDate.parse(dateStr, formatter).atStartOfDay();
                }
            } catch (Exception e) {
                // 忽略错误，尝试下一个格式
            }
        }
        
        System.err.println("无法解析日期格式: " + dateStr);
        return null;
    }
}